package vues;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Calendar;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.CaretListener;

import modele.ModeleMA;
import modele.ModeleP;
import controleurs.AjoutExitControler;
import controleurs.BoutonAjoutControlleur;
import controleurs.ChampsAjoutControlleurs;

public class MAFrame extends JFrame implements Observer{
	/**
	 * Cette fenetre permet l'ajout ou la modification de l'album en cours d'utilisation.
	 * Il permet de modifier(resp. creer) tous les champs necessaires a une bd.
	 */
	private static final long serialVersionUID = 5000746071439912122L;
	private CaretListener myControler;
	private ModeleP modelep;
	private ModeleMA modelema;
	private JButton validation;
	private JButton annulation;
	private JTextField titre;
	private JTextField editeur;
	private JTextField auteurs;
	private JTextField dessinateurs;
	private JTextField genres;
	private JTextField annee;
	private JTextField note;
	public JTextField img;
	private JTextArea resume;
	private JTextArea explication;
	private Dimension minDim=new Dimension(50,23);
	private Dimension prefDim=new Dimension(280, 23);
	public JFileChooser fc;
	/**
	 * Unique constructeur, permettant la construction de la fenetre d'ajout
	 * @param modelep Le modele principale
	 */
	public MAFrame(ModeleP modelep) {
		this.modelep=modelep;
		modelep.addObserver(this);
		this.setTitle("Ajout / Modification");
		this.setLayout(new GridBagLayout());
		this.setLocationRelativeTo(null);
		this.addWindowListener(new AjoutExitControler(modelep, this));
		//Initialisation des composants
		titre=new JTextField();
		titre.setName("titre");
		titre.setMinimumSize(minDim);
		titre.setPreferredSize(prefDim);
		titre.setToolTipText("Entrez un titre sans caractere speciaux (ex \"Super-BD : c'est, trop bien!.?\")");
		editeur=new JTextField();
		editeur.setName("editeur");
		editeur.setMinimumSize(minDim);
		editeur.setPreferredSize(prefDim);
		editeur.setToolTipText("Entrez un editeur sans caractere speciaux (ex \"Edition- : IUT\")");
		auteurs=new JTextField();
		auteurs.setName("auteurs");
		auteurs.setMinimumSize(minDim);
		auteurs.setToolTipText("Entrez une liste d'auteurs sans caractere speciaux (ex \"Jean Martinet, Iovka Boneva\")");
		auteurs.setPreferredSize(prefDim);
		dessinateurs=new JTextField();
		dessinateurs.setName("dessinateurs");
		dessinateurs.setMinimumSize(minDim);
		dessinateurs.setPreferredSize(prefDim);
		dessinateurs.setToolTipText("Entrez une liste de dessinateurs sans caractere speciaux (ex \"Jean Martinet, Iovka Boneva\")");
		genres=new JTextField();
		genres.setName("genres");
		genres.setMinimumSize(minDim);
		genres.setPreferredSize(prefDim);
		genres.setToolTipText("Entrez une liste d'auteurs sans caractere speciaux (ex \"Action,utopie\")");
		annee=new JTextField();
		annee.setName("annee");
		annee.setMinimumSize(minDim);
		annee.setPreferredSize(minDim);
		annee.setToolTipText("Entrez une l'annee d'edition comprise entre 1900 et l'annee actuelle");
		note=new JTextField();
		note.setName("note");
		note.setMinimumSize(minDim);
		note.setPreferredSize(minDim);
		note.setToolTipText("Entrez la note de la bd sur une echelle de 20");
		resume=new JTextArea();
		resume.setName("resume");
		resume.setMinimumSize(minDim);
		resume.setPreferredSize(new Dimension(275, 44));
		resume.setLineWrap(true);
		resume.setWrapStyleWord(true);
		resume.setToolTipText("Entrez un court resume de la bd (ex \"L'histoire de la vie d'Albert, merveilleux general lors des guerres persiennes\")");
		fc=new JFileChooser();
		img=new JTextField();
		img.setPreferredSize(prefDim);
		img.setMinimumSize(minDim);
		img.setName("image");
		explication=new JTextArea();
		explication.setVisible(false);
		explication.setBackground(new Color(0,0,0,0));
		explication.setOpaque(false);
		explication.setForeground(Color.red);
		explication.setEditable(false);
		explication.setLineWrap(true);
		explication.setWrapStyleWord(true);
		JScrollPane resumescroll=new JScrollPane(resume,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		resumescroll.setViewportView(resume);
		validation=new JButton("Valider");
		validation.setName("validation");
		annulation=new JButton("Annuler");
		annulation.setName("annulation");


		//Integration des composants
		GridBagConstraints gbc=new GridBagConstraints();
		gbc.insets=new Insets(2,4,2,4);
		gbc.anchor=GridBagConstraints.LINE_START;
		gbc.gridx=0;
		gbc.gridy=0;
		this.getContentPane().add(new JLabel("Titre : "),gbc);
		gbc.gridx=1;
		this.getContentPane().add(titre, gbc);
		gbc.gridy=1;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Editeur : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(editeur, gbc);
		gbc.gridy=2;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Auteur(s) : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(auteurs, gbc);
		gbc.gridy=3;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Dessinateur(s) : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(dessinateurs, gbc);
		gbc.gridy=4;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Genre(s) : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(genres, gbc);
		gbc.gridy=5;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Annee : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(annee, gbc);
		gbc.gridy=6;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Note : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(note, gbc);
		gbc.gridy=7;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Resume : "), gbc);
		gbc.gridx=1;
		gbc.gridheight=1;
		this.getContentPane().add(resumescroll, gbc);
		gbc.gridy=8;
		gbc.gridx=0;
		this.getContentPane().add(new JLabel("Image : "), gbc);
		gbc.gridx=1;
		this.getContentPane().add(img, gbc);
		gbc.gridy=9;
		gbc.gridx=1;
		gbc.gridwidth=1;
		gbc.gridheight=1;
		this.getContentPane().add(annulation,gbc);
		gbc.anchor=GridBagConstraints.LINE_END;
		gbc.gridx=1;
		this.getContentPane().add(validation, gbc);
		gbc.gridheight=2;
		gbc.gridy=10;
		gbc.gridwidth=2;
		gbc.gridx=0;
		gbc.fill=GridBagConstraints.HORIZONTAL;
		gbc.anchor=GridBagConstraints.LINE_START;
		this.getContentPane().add(explication, gbc);
		this.setResizable(false);
		this.setVisible(false);
		this.pack();
		this.setAlwaysOnTop(true);
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		if(modelep.amEnCours()){
			if(!this.isVisible()){
				setVisible(true);
				modelema=modelep.getModeleMA();
				modelema.addObserver(this);
				myControler =new ChampsAjoutControlleurs(modelema);
				//Ajout des Controleurs des composants
				titre.addCaretListener(myControler);
				auteurs.addCaretListener(myControler);
				dessinateurs.addCaretListener(myControler);
				genres.addCaretListener(myControler);
				editeur.addCaretListener(myControler);
				resume.addCaretListener(myControler);
				note.addCaretListener(myControler);
				annee.addCaretListener(myControler);
				img.addCaretListener(myControler);
				validation.addActionListener(new BoutonAjoutControlleur(modelema, this));
				annulation.addActionListener(new BoutonAjoutControlleur(modelema, this));
				img.addMouseListener(new MouseAdapter(){
					private boolean isChosen;
					public void mouseClicked(MouseEvent e) {
						if(!isChosen){
							int returnVal=fc.showOpenDialog(fc);
							if (returnVal == JFileChooser.APPROVE_OPTION) {
								img.setText(fc.getSelectedFile().getAbsolutePath());
								isChosen=true;
							}
						}
					}
				});
				if(modelema.getAlbum()==null){
					titre.setText("");
					auteurs.setText("");
					dessinateurs.setText("");
					genres.setText("");
					editeur.setText("");
					resume.setText("");
					note.setText("");
					annee.setText("");
					img.setText("");
				}else{
					titre.setText(modelema.getAlbum().getTitre());
					auteurs.setText(modelema.getAlbum().getAuteurs());
					dessinateurs.setText(modelema.getAlbum().getDessinateurs());
					genres.setText(modelema.getAlbum().getGenres());
					editeur.setText(modelema.getAlbum().getEditeur());
					resume.setText(modelema.getAlbum().getResume());
					note.setText(modelema.getAlbum().getNote());
					annee.setText(modelema.getAlbum().getAnnee());
					img.setText(modelema.getAlbum().getImage().isEmpty()?" ":modelema.getAlbum().getImage());
				}
			}
			if(this.isVisible()){
				if(modelema.valideTitre()<0)titre.setBackground(Color.pink);
				else if(modelema.valideTitre()==0)titre.setBackground(Color.lightGray);
				else titre.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideEditeur()<0)editeur.setBackground(Color.pink);
				else if(modelema.valideEditeur()==0)editeur.setBackground(Color.lightGray);
				else editeur.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideAuteur()<0)auteurs.setBackground(Color.pink);
				else if(modelema.valideAuteur()==0)auteurs.setBackground(Color.lightGray);
				else auteurs.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideDessinateurs()<0)dessinateurs.setBackground(Color.pink);
				else if(modelema.valideDessinateurs()==0)dessinateurs.setBackground(Color.lightGray);
				else dessinateurs.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideGenres()<0)genres.setBackground(Color.pink);
				else if(modelema.valideGenres()==0)genres.setBackground(Color.lightGray);
				else genres.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideAnnee()<0)annee.setBackground(Color.pink);
				else if(modelema.valideAnnee()==0)annee.setBackground(Color.lightGray);           
				else annee.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideNote()<0)note.setBackground(Color.pink);
				else if(modelema.valideNote()==0)note.setBackground(Color.lightGray);
				else note.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideResume()<0)resume.setBackground(Color.pink);
				else if(modelema.valideResume()==0)resume.setBackground(Color.lightGray);
				else resume.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(modelema.valideURL()<0)img.setBackground(Color.pink);
				else if(modelema.valideURL()==0)img.setBackground(Color.lightGray);
				else img.setBackground(Color.white);
				if(modelema.valide())validation.setEnabled(true);
				else validation.setEnabled(false);
				if(!modelema.valide()){
					if(modelema.valideTitre()==-1)
						explication.setText("Le champ Titre est incorrecte, evitez tout caracteres speciaux");
					else if(modelema.valideTitre()==-2)
						explication.setText("Cette bande dessinee existe deja");
					else if (modelema.valideAuteur()==-1)
						explication.setText("Le champ Auteur(s) est incorecte, evitez tout caracteres speciaux et separez les auteurs par des virgules");
					else if (modelema.valideDessinateurs()==-1)
						explication.setText("Le champ Dessinateur(s) est incorecte, evitez tout caracteres speciaux et separez les dessinateurs par des virgules");
					else if (modelema.valideGenres()==-1)
						explication.setText("Le champ Genre(s) est incorecte, evitez tout caracteres speciaux et separez les genres par des virgules");
					else if(modelema.valideEditeur()<0)
						explication.setText("Le champ Editeur est incorrecte, veuillez ne pas utiliser de caracteres speciaux");
					else if(modelema.valideResume()<0)
						explication.setText("Le champ Resume est incorrecte, veuillez ne pas utiliser de caracteres speciaux");
					else if(modelema.valideNote()<0)
						explication.setText("Le champ Note est incorrecte, veuillez entrez un nombre entre 0 et 20");
					else if(modelema.valideAnnee()<0)
						explication.setText("Le champ Annee est incorrecte, veuillez entrez une date entre 1900 et "+Calendar.getInstance().get(Calendar.YEAR));
					else if(modelema.valideURL()<0)
						explication.setText("L'url de l'image est incorrecte, veuillez en choisir une autre");
					else explication.setText("Veuillez remplir tous les champs");
					explication.setVisible(true);
				}else explication.setVisible(false);
			}
			this.pack();	
		}else setVisible(false);
	}
}
